package org.mx.spring.i18n;

import org.mx.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.support.AbstractMessageSource;

import java.util.List;
import java.util.Locale;

/**
 * 描述：I18N服务实现
 *
 * @author john peng
 * Date time 2019/7/24 10:13 PM
 */
public class I18nService {
    private static final Logger logger = LoggerFactory.getLogger(I18nService.class);

    private List<AbstractMessageSource> messageSources;
    private Locale local = Locale.getDefault();

    /**
     * 默认的构造函数
     *
     * @param factory 可重载资源包工厂
     */
    public I18nService(I18nResourceBundleFactory factory) {
        super();
        if (factory != null) {
            this.messageSources = factory.getMessageSources();
        }
    }

    /**
     * 设置当前语种，如：en、zh、zh_CN
     *
     * @param local 语种名
     * @see Locale
     */
    public void setLocal(String local) {
        if (!StringUtils.isBlank(local)) {
            String[] segs = StringUtils.split(local, "_", true, true);
            if (segs.length > 1) {
                this.local = new Locale(segs[0], segs[1]);
            } else {
                this.local = new Locale(local);
            }
        }
    }

    /**
     * 获取指定的消息资源
     *
     * @param key    消息资源的关键字
     * @param local  语种名
     * @param params 消息资源的参数
     * @return 如果找到对应翻译，则返回翻译，否则返回null。
     */
    private String getMessage(String key, Locale local, Object... params) {
        for (AbstractMessageSource messageSource : messageSources) {
            try {
                String message = messageSource.getMessage(key, params, local);
                if (!StringUtils.isBlank(message)) {
                    return message;
                }
            } catch (NoSuchMessageException ex) {
                if (logger.isWarnEnabled()) {
                    //logger.warn(String.format("The message[%s] not exist for locale[%s] from %s.", key, local.getDisplayName(), messageSource.getClass().getName()));
                }
            }
        }
        return null;
    }

    /**
     * 从多语言包中获取指定的翻译文本
     *
     * @param key 关键字
     * @return 翻译的文本
     */
    public String getMessage(String key) {
        return getMessage(key, this.local, (Object)null);
    }

    /**
     * 从多语言包中获取指定的翻译文本
     *
     * @param key    关键字
     * @param params 格式化参数
     * @return 翻译的文本
     */
    public String getMessage(String key, Object... params) {
        try {
            return getMessage(key, this.local, params);
        } catch (NoSuchMessageException ex) {
            if (logger.isWarnEnabled()) {
                logger.warn(String.format("The message[%s] not exist for locale[%s].", key, local.getDisplayName()));
            }
            return null;
        }
    }
}
